首页 > 试题广场 >

寻找峰值

[编程题]寻找峰值
  • 热度指数:161113 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] =
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:



如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:
示例1

输入

[2,4,1,2,7,8,4]

输出

1

说明

4和8都是峰值元素,返回4的索引1或者8的索引5都可以     
示例2

输入

[1,2,3,1]

输出

2

说明

3 是峰值元素,返回其索引 2     
# 尝试直接查找最大值的索引
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        return nums.index(max(nums))

编辑于 2024-02-27 16:44:54 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        lu=len(nums)
        l=lu-1
        if len(nums)==1:
            return int(0)
        if len(nums)==2:
            if nums[0]>nums[1]:
                return 0
            else:
                return 1
        if nums[0]>nums[1] and nums[1]>nums[2]:
            return int(0)
       
        if nums[l]>nums[l-1] and nums[l-1]>nums[l-2]:
            return int(l)

        for i in range(1,l):
            if nums[i]>nums[i-1] and nums[i]>nums[i+1]:
                return int(i)
发表于 2023-11-09 14:09:33 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        return nums.index(max(nums))

最大值必为峰值
发表于 2023-08-23 16:29:33 回复(0)
奇奇怪怪的通过了,不过不如二分
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        L =len(nums)
        l =L-1
        if L ==1:
            return 0
        for i in range(L):
            if i ==0:
                if nums[i]>nums[i+1]:
                    return i
            elif i ==l:
                if nums[i-1]<nums[i]:
                    return i
            else:
                if nums[i]>nums[i-1] and nums[i]>nums[i+1]:
                    return i
            

发表于 2023-07-24 16:43:42 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        if len(nums)>2:
            for i in range(len(nums)):
    #             res = nums[i:i+3]
                if nums[len(nums)-1]>nums[len(nums)-2]:
                    return len(nums)-1
                if nums[0]>nums[1]:
                    return 0
                if nums[i]<nums[i+1] and nums[i+1]>nums[i+2]:
                    return i+1
        if len(nums)==2:
            return nums.index(max(nums))
        else:
            return 0
根据答案写代码,又臭又长,等回来考古
发表于 2022-08-29 11:37:09 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        #暴力可太蠢了
        if len(nums) == 1:
            return 0
        if nums[0]>nums[1]:
            return 0
        if nums[len(nums)-1]>nums[len(nums)-2]:
            return len(nums)-1
        for i in range(len(nums)):
            if nums[i] > nums[i - 1] and nums[i] > nums[i + 1]:
                return i
发表于 2022-08-28 00:14:19 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        n=len(nums)
        if n==1:
            return 0
        l=0
        r=n-1
        while l<r:#注意此处不能取到=
            mid=int((l+r)/2)
            if nums[mid] >= nums[mid+1]:
                r=mid
            else:
                l=mid+1
        return r
        

发表于 2022-08-24 15:15:00 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        return nums.index(max(nums))
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        if len(nums) == 1:
            return 0
        if nums[0] > nums[1]:
            return 0
        if nums[-1] > nums[-2]:
            return len(nums)-1
        for i in range(1, len(nums)):
            if nums[i] > nums[i-1] and nums[i] > nums[i+1]:
                return i

发表于 2022-07-21 10:51:31 回复(0)
python 滑动窗口法:
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        # 可以用滑动窗口法来解,窗口大小为3
        nums_len = len(nums)
        if nums_len == 1:
            return 0
        elif nums_len == 2:
            if nums[0] > nums[1]:
                return 0
            else:
                return 1
        else:
            nums.append(-9999)
            nums.insert(0,-9999)
            for i in range(1,len(nums)+1):
                if nums[i] > nums[i+1] and nums[i] > nums[i-1]:
                    # 以为数组前面已经插入一个元素,所有要返回的索引为i-1
                    return i-1
                    break

发表于 2022-07-20 18:48:14 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if nums[mid] > nums[mid+1]:
                right = mid
            else:
                left = mid + 1
        return right

发表于 2022-07-19 19:37:47 回复(0)

二分查找
时间复杂度:O(logn) 空间复杂度O(1)

class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if nums[mid] > nums[mid + 1]:
                right = mid
            else:
                left = mid + 1
        return right
发表于 2022-05-16 11:48:55 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        nums = [-2**31] + nums + [-2**31]
        for i in range(1,len(nums)-1):
            if nums[i] > nums[i-1] and nums[i] > nums[i+1]:
                return i-1

发表于 2022-04-25 10:48:54 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        m = len(nums)
        if m <= 1:
            return 0
        else:
            for i in range(m):
                if nums[0] > nums[1]:
                    return 0
                elif nums[-1] > nums[-2]:
                    return m-1
                else:
                    for i in range(1,m-1) :
                        if nums[i] > nums[i-1] and nums[i] > nums[i+1]:
                            return i
                            break
                        

发表于 2022-04-16 21:31:49 回复(0)
python三种方法;前两种时间复杂均为o(N)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
#直接返回
#         return nums.index(max(nums))
# #左侧开始搜寻
#         res = 0
#         for i in range(len(nums)-1):
#             if nums[i]<nums[i+1]:res+=1
#             else:
#                 return res
#         return res 
#二分法:核心思想逼近峰顶,往上坡走
        i,j = 0,len(nums)-1
        while i < j:
            mid =i+(j-i)//2
            if nums[mid]<nums[mid+1]:i = mid+1
            else:j = mid
        return i

发表于 2022-04-09 11:36:34 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        max_value = max(nums)
        if nums.index(max_value) == 0:
            return 0
        elif nums.index(max_value) == len(nums)-1:
            return len(nums)-1
        else:
            return nums.index(max_value)

# 最大值比较就完了
发表于 2022-04-01 18:11:16 回复(0)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        if len(nums) == 1:
            return 0
        elif nums[0] > nums[1]:
            return 0
        elif nums[-1] > nums[-2]:
            return nums.index(nums[-1])
        else:
            for i in range(1,len(nums)-1):
                if nums[i] > nums[i+1] and nums[i] > nums[i-1]:
                    return i

发表于 2022-03-22 00:01:00 回复(0)

问题信息

上传者:牛客301499号
难度:
25条回答 5600浏览

热门推荐

通过挑战的用户

查看代码